home *** CD-ROM | disk | FTP | other *** search
/ Apple II Magazines (DO) / Nibble Volume 12, No. 08 (1991-08)(MindCraft Publishing)(Side B).zip / Nibble Volume 12, No. 08 (1991-08)(MindCraft Publishing)(Side B).do / MEMORY.PROBE.S < prev    next >
Text File  |  1996-12-24  |  35KB  |  1,094 lines

  1. *****************************
  2. *        MEMORY.PROBE       *
  3. *             by            *
  4. *        Jim Benedict       *
  5. *     Copyright 1991 by     *
  6. *     MindCraft Publ. Corp. *
  7. *     Lincoln, MA  01773    *
  8. *****************************
  9. *
  10. * Merlin Assembler
  11. *
  12. *
  13. * Zero Page Addresses
  14. *
  15. PAGE      = $00          ;read memory pointer
  16. LENGTH    = $2           ;max. length of input
  17. LEFT      = $3           ;left edge input
  18. DATALNTH  = $7           ;actual length of input
  19. WNDLFT    = $20          ;text window
  20. WNDWDTH   = $21
  21. WNDTOP    = $22
  22. WNDBTM    = $23
  23. CH        = $24          ;cursor position
  24. CV        = $25
  25. BASL      = $28          ;screen address
  26. CSWL      = $36          ;output hook low byte
  27. PCL       = $3A          ;disassembly address
  28. A2L       = $3E          ;for hex conversion
  29. RAMFLAG   = $EB          ;0=ROM, 1=RAM1, 2=RAM2
  30. RAMBYTE   = $EC          ;LOB softswitch address
  31. SAVEY     = $ED          ;preserve Y
  32. INDEX     = $F9          ;option index
  33. FORMFLAG  = $FA          ;0=hex, 1=dec, 2=asc.
  34. MEMFLAG   = $FB          ;0=main, 1=aux memory
  35. BANKINDX  = $FC          ;index to bank #'s
  36. BANKSAVE  = $FD          ;memory bank to access
  37. COUNTER   = $FE
  38. STACK     = $100
  39. IN        = $200         ;input buffer
  40. DOS       = $3D0
  41. OURCH     = $57B         ;80-col CH
  42. *
  43. * Page $C0 addresses
  44. *
  45. KEY       = $C000        ;keyboard
  46. STOR80OFF = $C000        ;switch $200-$BFFF
  47. STOR80ON  = $C001        ;don't switch display
  48. RAMRDMAIN = $C002        ;read main memory 48K
  49. RAMRDAUX  = $C003        ;read aux memory 48K
  50. SETSLOTCXROM = $C006     ;turn on ROM in slots
  51. SETINTCXROM = $C007      ;internal ROM
  52. SETSTDZP  = $C008        ;main pages 0,1,$D0-FF
  53. SETALTZP  = $C009        ;aux pages 0,1,$D0-FF
  54. STROBE    = $C010        ;clear keyboard
  55. SPEAKER   = $C030
  56. PAGE2MAIN = $C054        ;text screen main mem.
  57. PAGE2AUX  = $C055        ;text screen aux mem.
  58. BANKREG   = $C073        ;bank register
  59. READROM   = $C082        ;read ROM $D000-$FFFF
  60. READRAM2  = $C080        ;RAM, $D0-DF bank 2
  61. READRAM1  = $C088        ;RAM, $D0-DF bank 1
  62. *
  63. * Monitor addresses
  64. *
  65. PRNTAX    = $F941        ;print hex #, AX
  66. PRBLNK    = $F948        ;print 3 spaces
  67. PRBL2     = $F94A        ;print X spaces
  68. INIT      = $FB2F        ;initialize system
  69. TABV      = $FB5B        ;get screen address
  70. VERSION   = $FBB3        ;6=//e or c
  71. IDBYTE    = $FBC0        ;$EA=//e, $E0=enhanced
  72.                          ;$00=//c
  73. HOME      = $FC58        ;clear screen
  74. WAIT      = $FCA8        ;(26+27A+5A^2)/2 ms.
  75. CROUT     = $FD8E        ;output carriage return
  76. PRBYTE    = $FDDA        ;print hex value of A
  77. COUT      = $FDED        ;output a char
  78. LIST2     = $FE63        ;disassemble A lines
  79. SETINV    = $FE80        ;set inverse mode
  80. SETNORM   = $FE84        ;set normal mode
  81. SETVID    = $FE93        ;do PR#0
  82. OUTPORT   = $FE95        ;PR# A register
  83. GETNUM    = $FFA7        ;convert ascii to hex
  84. ZMODE     = $FFC7
  85.  
  86.           ORG $8000
  87. *
  88. * Initialize system
  89. *
  90.           JSR INIT
  91.           LDA #0
  92.           JSR OUTPORT
  93.           JSR HOME
  94.           LDA VERSION    ;check machine
  95.           CMP #6         ;is it //c or //e?
  96.           BEQ CONTINUE   ;yes
  97.           LDY #0
  98. ]LOOP     LDA APPLEII,Y  ;won't work on II
  99.           BEQ DONEII
  100.           JSR COUT
  101.           INY
  102.           BNE ]LOOP      ;always
  103. DONEII    JSR READKEY    ;get a keystroke
  104.           JMP ALLDONE    ;exit into DOS
  105.  
  106. CONTINUE  LDX #1         ;1 aux. bank (128K)
  107.           JSR RTS        ;space for READMEM call
  108.           STX BANKAVAL+1 ;# of banks available
  109.           LDX #$FF       ;set stack pointer
  110.           TXS            ;to protect subroutine
  111.           LDY #$0E       ;# of bytes in routine
  112. ]LOOP     LDA STACKSUB,Y ;put read aux memory
  113.           STA STACK,Y    ;subroutine on stack
  114.           DEY
  115.           BPL ]LOOP
  116.           LDA #0
  117.           LDX #5         ;6 bytes
  118. ]LOOP     STA $F9,X      ;clear flags
  119.           DEX            ;$F9-FE
  120.           BPL ]LOOP      ;loop through zero
  121.           STA PAGE       ;default first page
  122.           LDA #8         ;is $800
  123.           STA PAGE+1
  124.           LDA #1         ;default RAM1
  125.           STA RAMFLAG    ;set it
  126.           LDA #$88       ;low order byte of
  127.           STA RAMBYTE    ;softswitch for RAM1
  128.           LDX #3         ;ROM/RAM1/RAM2 for //c
  129.           LDA IDBYTE     ;//e or //c?
  130.           BEQ SETMACH    ;//c
  131.           INX            ;ROM/RAM1/RAM2/SLOT
  132. SETMACH   STX MACHINE+1  ;set RAM toggle limit
  133. *
  134. * Print title screen
  135. *
  136.           LDA #9         ;set window
  137.           STA WNDLFT
  138.           LDA #31
  139.           STA WNDWDTH
  140.           LDA #4
  141.           STA WNDTOP
  142.           JSR SETCRSR    ;put cursor in window
  143.           LDY #0
  144. ]LOOP     LDA TITLE,Y    ;print title
  145.           BEQ DONETITL
  146.           JSR COUT
  147.           INY
  148.           BNE ]LOOP      ;always
  149. DONETITL  JSR READKEY    ;get keypress
  150. *
  151. * Print data screen
  152. *
  153.           LDA #3         ;turn on 80 columns
  154.           JSR OUTPORT    ;(resets text window)
  155. ]LOOP     JSR NORMLOP    ;print option line
  156.           INC INDEX
  157.           LDX INDEX
  158.           CPX #9         ;done all 9?
  159.           BNE ]LOOP      ;loop till done
  160.           LDX #0
  161.           STX INDEX      ;default first option
  162.           JSR INVRSOP    ;print it inverse
  163.           JSR PRTDASH    ;print dashed line
  164.           JSR PRTLONIB   ;do low nibble address
  165.           LDA #3
  166.           STA WNDTOP     ;protect options
  167.           JSR DOPAGE     ;print first page
  168.           JSR PRTDASH    ;dashes under data
  169.           JSR INSTRUCT   ;print instructions
  170. *
  171. * Get command
  172. *
  173. MAINLOOP  JSR READKEY    ;get a key
  174.           CMP #$8D       ;return?
  175.           BEQ COMMAND    ;do command
  176.           CMP #$88       ;left arrow?
  177.           BEQ DECINDEX   ;next option left
  178.           CMP #$95       ;right arrow?
  179.           BEQ INCINDEX   ;next option right
  180.           CMP #$A0       ;space bar
  181.           BEQ TOGGLE     ;toggle some values
  182.           CMP #$9B       ;escape key?
  183.           BEQ QUIT       ;yes
  184.           JSR BELL       ;wrong key
  185.           BEQ MAINLOOP   ;always
  186. *
  187. * Move cursor
  188. *
  189. DECINDEX  JSR NORMLOP    ;current option normal
  190.           DEC INDEX      ;new option to left
  191.           BPL PRNTOP     ;in range, print it
  192.           LDX #8         ;reset index
  193.           BNE STORIT     ;always
  194. INCINDEX  JSR NORMLOP    ;current option normal
  195.           LDX INDEX
  196.           INX            ;new option to right
  197.           CPX #9         ;over maximum?
  198.           BNE STORIT     ;no
  199.           LDX #0         ;reset to zero
  200. STORIT    STX INDEX      ;new option #
  201. PRNTOP    JSR INVRSOP    ;print it inverse
  202.           JMP MAINLOOP   ;get next command
  203. *
  204. * Quit program
  205. *
  206. QUIT      JSR BELL
  207.           LDA #>QUITMSG  ;get message address
  208.           LDX #<QUITMSG
  209.           JSR MSGOUT     ;display message
  210.           JSR READKEY    ;get keypress
  211.           CMP #$9B       ;is it ESCAPE?
  212.           BEQ ALLDONE    ;yes
  213.           JSR INSTRUCT   ;display instructions
  214.           JMP MAINLOOP   ;back to main loop
  215. ALLDONE   JSR SETVID     ;do pr#0
  216.           JSR INIT       ;clear system
  217.           JSR HOME       ;clear screen
  218.           JMP DOS        ;exit into DOS
  219. *
  220. * JSR to proper routine
  221. *
  222. COMMAND   LDA INDEX      ;get active option #
  223.           ASL            ;double it
  224.           TAY            ;index into jump table
  225.           LDA CMDTABLE,Y ;get low byte
  226.           STA JSRCMD+1   ;put in address
  227.           LDA CMDTABLE+1,Y ;get high byte
  228.           STA JSRCMD+2   ;put in address
  229. JSRCMD    JSR JSRCMD     ;do right routine
  230.           JMP MAINLOOP   ;back to main loop
  231. *
  232. * Toggle some values
  233. *
  234. TOGGLE    LDA INDEX      ;get active option #
  235.           ASL
  236.           TAY            ;index for toggle table
  237.           LDA TOGLTABL,Y
  238.           STA JSRTOGL+1
  239.           LDA TOGLTABL+1,Y
  240.           STA JSRTOGL+2  ;put in address
  241. JSRTOGL   JSR JSRTOGL    ;do routine
  242.           JMP MAINLOOP   ;back to main loop
  243. *
  244. * Change page routines
  245. *
  246. NEXTPAGE  INC PAGE+1     ;up the address
  247.           LDA PAGE+1
  248.           CMP #$C0       ;page $C0?
  249.           BEQ NEXTPAGE   ;yes, skip it
  250.           JMP DOPAGE     ;print next page
  251.  
  252. PREVPAGE  DEC PAGE+1     ;lower the address
  253.           LDA PAGE+1
  254.           CMP #$C0       ;page C0?
  255.           BEQ PREVPAGE   ;yes, skip it
  256.           JMP DOPAGE     ;print previous page
  257.  
  258. NEWPAGE   LDA #>NEWMSG   ;get message address
  259.           LDX #<NEWMSG
  260.           JSR MSGOUT
  261.           STA IN         ;zero input
  262.           LDX OURCH      ;cursor already at
  263.           STX LEFT       ;left edge input field
  264.           LDX #2         ;# of chars allowed
  265.           STX LENGTH
  266.           JSR INPUT      ;get input
  267.           BCS CANCEL     ;no data or escape
  268.           JSR ZMODE      ;hex input
  269.           JSR GETNUM     ;convert to hex data
  270.           LDA A2L        ;get page number
  271.           CMP #$C0       ;page $C0?
  272.           BNE ALLSET     ;no
  273.           JSR BELL       ;can't read page $C0
  274.           BEQ NEWPAGE    ;try again
  275. ALLSET    STA PAGE+1     ;save new address
  276.           JSR DOPAGE     ;display new page
  277. CANCEL    JMP INSTRUCT   ;replace instructions
  278. *
  279. * Toggle format option
  280. *
  281. FORMAT    LDX FORMFLAG   ;get format
  282.           DEX            ;set for next one
  283.           BPL STORFORM   ;in range
  284.           LDX #2         ;reset
  285. STORFORM  STX FORMFLAG   ;save new format
  286.           TXA
  287.           ASL
  288.           ASL            ;0,4,8
  289.           TAY            ;index into new text
  290.           LDX #0         ;index into option line
  291. ]LOOP     LDA FORMTEXT,Y ;get new text
  292.           BEQ DONEFORM
  293.           STA FORMATOP,X ;put in option line
  294.           INY
  295.           INX
  296.           BNE ]LOOP      ;always
  297. DONEFORM  JMP INVRSOP    ;update option
  298. *
  299. * Toggle memory option
  300. *
  301. MEMORY    LDA MEMFLAG    ;get memory status
  302.           EOR #1         ;toggle 0/1
  303.           STA MEMFLAG    ;0=main, 1=aux
  304.           BEQ SETY
  305.           LDA #5         ;A=0 or 5
  306. SETY      TAY            ;index into new text
  307.           LDX #0         ;index into option line
  308. ]LOOP     LDA MEMTEXT,Y  ;get new text
  309.           BEQ CHKBANK
  310.           STA MEMORYOP,X ;put in option line
  311.           INY
  312.           INX
  313.           BNE ]LOOP      ;always
  314. CHKBANK   LDA MEMFLAG    ;aux. memory on?
  315.           BNE AUXBANK    ;yes
  316.           LDA #$A0       ;space
  317.           STA BANKOP+6   ;blank out bank #
  318.           STA BANKOP+7   ;in option text
  319.           BNE DOBANK     ;always
  320. AUXBANK   LDX #0         ;bank 0
  321.           JSR SETBANK    ;set bank option text
  322. DOBANK    INC INDEX      ;to print bank option
  323.           JSR NORMLOP    ;print it
  324.           DEC INDEX      ;main/aux option
  325.           JMP INVRSOP    ;print it inverse
  326. *
  327. * Toggle bank number
  328. *
  329. BANK      LDX MEMFLAG    ;aux. memory on?
  330.           BNE OKAYBANK   ;yes
  331.           JMP BELL       ;no bank in main mem.
  332. OKAYBANK  LDX BANKINDX   ;get current bank index
  333.           INX            ;toggle increases value
  334. BANKAVAL  CPX #0         ;line 109 sets this
  335.           BNE BANKOK     ;in range, all right
  336.           LDX #0         ;reset to start
  337. BANKOK    JSR SETBANK    ;set option text
  338.           JMP INVRSOP    ;update option
  339.  
  340. SETBANK   STX BANKINDX   ;save new index
  341.           LDA BANKTABL,X ;get bank #
  342.           STA BANKSAVE   ;save it
  343.           JSR HEXASC     ;convert to ascii
  344.           STA BANKOP+6   ;set option text
  345.           STX BANKOP+7   ;to new value
  346.           RTS
  347. *
  348. * Toggle ROM/RAM1/RAM2/SLOTROM option
  349. *
  350. RAMROM    STX SETINTCXROM ;default internal ROM
  351.           LDX RAMFLAG    ;get current choice
  352.           INX            ;increase it
  353. MACHINE   CPX #4         ;line 133 sets to 3 or 4
  354.           BCC RAMOK      ;yes
  355.           LDX #0         ;reset
  356. RAMOK     STX RAMFLAG    ;save new index
  357.           CPX #3         ;SLOTROM selected?
  358.           BNE SKIPROM    ;no
  359.           STX SETSLOTCXROM ;turn on SLOTROM
  360. SKIPROM   LDA BYTETABL,X ;get new address
  361.           STA RAMBYTE    ;for bank-switch
  362.           LDA #0
  363.           CLC            ;prepare to add
  364. ]LOOP     DEX            ;0 to 3 times
  365.           BMI OKY        ;A=0,5,10,15
  366.           ADC #5         ;add 5 to A
  367.           BNE ]LOOP      ;loop till finished
  368. OKY       TAY            ;index into new text
  369.           INX            ;index into option line
  370. ]LOOP     LDA RAMTEXT,Y  ;get new text
  371.           BEQ DONERAM
  372.           STA RAMOP,X    ;put in option line
  373.           INY
  374.           INX
  375.           BNE ]LOOP      ;always
  376. DONERAM   JMP INVRSOP    ;update option
  377. *
  378. * Disassemble code
  379. *
  380. DISASMBL  LDA #>DISMSG   ;get message address
  381.           LDX #<DISMSG
  382.           JSR MSGOUT
  383.           LDA PAGE       ;move page address
  384.           STA PCL        ;to disassembly
  385.           LDA PAGE+1     ;pointer
  386.           STA PCL+1
  387.           DEC WNDBTM
  388.           DEC WNDTOP     ;use all space
  389.  
  390. * Set up address
  391.  
  392. DISLOOP   LDX #49        ;set cursor to
  393.           STX LEFT       ;left edge input
  394.           LDA #20        ;line 21
  395.           JSR SETCRSRX
  396.           LDA PCL+1      ;address for disasm.
  397.           JSR HEXASC     ;convert to ascii
  398.           STA IN         ;put address in
  399.           STX IN+1       ;input buffer as
  400.           LDA PCL        ;though typed
  401.           JSR HEXASC     ;so we can accept
  402.           STA IN+2       ;or change address
  403.           STX IN+3       ;at will
  404.           LDA #4
  405.           STA LENGTH     ;4 chars allowed
  406.           JSR INPUT      ;get input
  407.           BCS QUITDIS    ;no data or escape
  408.           JSR ZMODE      ;convert to hex
  409.           JSR GETNUM     ;puts value in A2L
  410.           LDA A2L+1      ;high byte
  411.           CMP #$C0       ;reading $C0 page?
  412.           BNE ITSOKAY    ;no
  413.           JSR BELL       ;can't do page $C0
  414.           BEQ DISLOOP    ;print previous address
  415. ITSOKAY   STA PCL+1      ;HOB disassembly
  416.           LDA A2L        ;low byte
  417.           STA PCL        ;LOB disassembly
  418.           LDA MEMFLAG    ;disasm. main only
  419.           BEQ GOCHECK    ;main mem. on
  420.           JSR TOGLMEM    ;toggle to main
  421. GOCHECK   LDA A2L+1
  422.           LDX RAMFLAG
  423.           JSR CHECKC0    ;check option line
  424.  
  425. * Disassemble 34 lines
  426.  
  427.           JSR HOME
  428.            LDA  #1
  429.            JSR  SETCRSR  ;top line
  430.           LDA #17        ;do 17 lines
  431.           JSR LIST2      ;monitor disassembler
  432.           LDA PCL+1      ;page $C0 check
  433.           CMP #$C0       ;reading will crash
  434.           BEQ DISLOOP    ;so stop
  435.           LDA #40
  436.           STA WNDLFT     ;right column
  437.           LDA #1
  438.           JSR SETCRSR    ;top of window
  439.           LDA #17
  440.           JSR LIST2      ;do second column
  441.           LDA #0         ;reset window
  442.           STA WNDLFT
  443.           BEQ DISLOOP    ;always
  444.  
  445. QUITDIS   LDX PCL+1      ;set PAGE to where
  446.           CPX #$C0       ;disassembly left off
  447.           BNE SKIP       ;but skip page $C0
  448.           INX
  449. SKIP      STX PAGE+1
  450.           JSR INSTRUCT   ;display instructions
  451.           JSR PRTLONIB   ;display low addresses
  452.           JMP DOPAGE     ;display data
  453. *
  454. * Printer
  455. *
  456. PRINTER   JSR DOPAGE     ;in case of changes
  457.           LDA #>PRNTMSG  ;get message address
  458.           LDX #<PRNTMSG
  459.           JSR MSGOUT
  460. GETKEY    JSR READKEY    ;read a key
  461.           CMP #$8D       ;return?
  462.           BEQ DUMPIT     ;yes
  463.           CMP #$9B       ;escape key?
  464.           BEQ DONEDUMP   ;yes
  465.           JSR BELL       ;wrong key
  466.           BEQ GETKEY     ;try again
  467. DUMPIT    LDA #20
  468.           STA WNDTOP     ;protect data
  469.           LDA #24
  470.           STA WNDBTM
  471.           JSR HOME       ;clear instructions
  472.           JSR DBLDUMP    ;dump screen
  473. DONEDUMP  JMP INSTRUCT   ;replace instructions
  474. *
  475. * Check option line
  476. *
  477. OPCHECK   LDA PAGE+1     ;check address
  478.           LDX RAMFLAG    ;get selected RAM/ROM
  479.           CMP #$D0       ;less than page $D0?
  480.           BCC CHECKC0    ;yes
  481.           LDY MEMFLAG    ;main memory on?
  482.           BEQ D0ANDUP    ;pages >$D0
  483.           CPX #0         ;aux.memory only
  484.           BEQ TORAM1     ;no ROM in aux.mem
  485.           CPX #3         ;no SLOTROM in aux.mem
  486.           BEQ TORAM1
  487. D0ANDUP   CPX #3         ;SLOTROM selected?
  488.           BEQ TOROM      ;must want ROM
  489.           CMP #$E0       ;pages $D0-DF?
  490.           BCC DNOPCHK    ;yes, any bank okay
  491.           CPX #2         ;RAM2?
  492.           BNE DNOPCHK    ;no, then it's okay
  493.           BEQ TORAM1     ;yes, toggle to RAM1
  494.  
  495. CHECKC0   CMP #$C0       ;pages $00-$BF?
  496.           BCC LSTHNC0    ;yes, RAM1 only
  497.           LDY MEMFLAG    ;$C0-CF, main mem?
  498.           BEQ CHEKSLOT   ;yes
  499.           JSR TOGLMEM    ;toggle to main mem.
  500.           LDA PAGE+1     ;reset address
  501.           LDX RAMFLAG    ;reset X
  502. CHEKSLOT  CPX #3         ;SLOTROM selected?
  503.           BNE CHEKROM    ;no
  504.           CMP #$C3       ;page $C3?
  505.           BEQ TOROM      ;yes, don't turn it on
  506.           CMP #$C8       ;pages $C8-$CF?
  507.           BCS TOROM      ;yes, no slots
  508.           BCC DNOPCHK    ;SLOTROM okay
  509. CHEKROM   CPX #0         ;ROM selected?
  510.           BEQ DNOPCHK    ;yes
  511.           LDX #3         ;toggle to ROM
  512.           BNE TOROM      ;always
  513. LSTHNC0   CPX #1         ;RAM1 selected?
  514.           BEQ DNOPCHK    ;yes, okay
  515. TORAM1    LDX #0         ;toggle to RAM1
  516. TOROM     STX RAMFLAG
  517.           JSR TOGLRAM    ;toggle to RAM1 or ROM
  518. DNOPCHK   RTS            ;finished
  519. *
  520. * Display a page of data
  521. *
  522. DOPAGE    JSR OPCHECK    ;check option line
  523.           DEC WNDBTM     ;protect bottom dashes
  524.           JSR HOME       ;clear old data
  525.           INC WNDBTM     ;restore window bottom
  526.           LDA RAMBYTE    ;lang. card softswitch
  527.           STA BANKSWCH+1 ;to activate right area
  528.           STA BANKSWCH2+1
  529. BANKSWCH  LDA $C000      ;set lang. card area
  530.           LDY #0         ;byte to read
  531.           STY COUNTER    ;for output loop
  532.           LDA MEMFLAG    ;main memory?
  533.           BEQ READ2      ;yes
  534.           LDA PAGE+1     ;check address
  535.           CMP #2         ;aux pages 0,1?
  536.           BCC READ3      ;yes
  537.           CMP #$D0       ;aux pages >=$D0?
  538.           BCS READ3      ;yes
  539.  
  540. READ1     LDA BANKSAVE   ;to read aux 48K
  541.           STA BANKREG    ;set bank to read
  542.           JSR STACK      ;read a byte
  543.           LDX #0         ;reset bank to zero
  544.           STX BANKREG
  545.           JSR OUTPUT     ;print byte
  546.           INY
  547.           BNE READ1      ;do $FF bytes
  548.           BEQ DONEREAD   ;all done
  549.  
  550. READ2     LDA (PAGE),Y   ;read main memory
  551.           JSR OUTPUT     ;print byte
  552.           INY
  553.           BNE READ2      ;do $FF bytes
  554.           BEQ DONEREAD   ;all done
  555.  
  556. READ3     LDA PAGE       ;read aux zp area
  557.           STA MAINPAGE+1 ;move pointer
  558.           LDA PAGE+1     ;from zero page
  559.           STA MAINPAGE+2 ;to unswitched memory
  560. ]LOOP     LDA BANKSAVE   ;set bank to read
  561.           STA BANKREG
  562.           STA SETALTZP   ;turn on aux zp
  563. MAINPAGE  LDA MAINPAGE,Y ;pointer address
  564.           STA SETSTDZP   ;turn on main zp
  565.           LDX #0         ;reset bank
  566.           STX BANKREG
  567.           JSR OUTPUT     ;print byte
  568.           INY            ;get next byte
  569.           BNE ]LOOP      ;for $FF bytes
  570.  
  571. DONEREAD  LDA READROM    ;turn on ROM
  572. RTS       RTS            ;dummy subroutine
  573.  
  574. * Output a byte to the screen
  575.  
  576. OUTPUT    PHA            ;preserve byte
  577.           STY SAVEY      ;save loop index
  578.           LDA READROM    ;need ROM for monitor
  579.           LDA COUNTER
  580.           AND #$0F       ;first byte in line?
  581.           BNE SKIPADR    ;no
  582.           LDX #5
  583.           JSR PRBL2      ;print 5 spaces
  584.           LDA PAGE+1     ;HOB address
  585.           LDX COUNTER    ;LOB address
  586.           JSR PRNTAX     ;print address
  587.           LDA #":"
  588.           JSR COUT       ;print colon
  589. SKIPADR   LDX FORMFLAG   ;what format?
  590.           BEQ HEX        ;hex mode=0
  591.           DEX
  592.           BEQ DEC        ;decimal mode=1
  593.  
  594. ASCII     PLA            ;get char
  595.           PHA            ;keep it safe
  596.           AND #$60       ;send control char
  597.           BEQ HEX        ;as hex data
  598.           JSR PRBLNK     ;3 spaces
  599.           PLA            ;get char
  600.           JSR COUT       ;print it
  601.           JMP DONEOUT    ;finished
  602.  
  603. HEX       LDX #2
  604.           JSR PRBL2      ;2 spaces
  605.           PLA            ;get char
  606.           JSR PRBYTE     ;output the byte
  607.           JMP DONEOUT
  608.  
  609. DEC       LDA #$A0
  610.           JSR COUT       ;1 space
  611.           PLA            ;get char
  612.           JSR DECIMAL    ;convert to decimal
  613.           LDX #2         ;print 3 digits
  614. ]LOOP     LDA DECMLBFR,X ;get digit
  615.           JSR COUT       ;print it
  616.           DEX
  617.           BPL ]LOOP      ;till done
  618.  
  619. DONEOUT   INC COUNTER    ;advance counter
  620.           LDA COUNTER    ;check it
  621.           AND #$0F       ;take low nibble
  622.           BNE BANKSWCH2  ;not done 16 bytes
  623.           JSR CROUT      ;end of line
  624. BANKSWCH2 LDA $C000      ;reset lang. card
  625.           LDY SAVEY      ;restore Y for READ
  626.           RTS
  627. *
  628. * Subroutines
  629. *
  630. SETCRSR   LDX #0         ;left edge
  631. SETCRSRX  STX OURCH      ;at X
  632.           STX CH
  633.           JMP TABV       ;set vertical from A
  634.  
  635. INVRSOP   JSR SETINV     ;print option inverse
  636. NORMLOP   LDX INDEX      ;get option
  637.           LDA CRSRTABL,X ;get CH position
  638.           TAX            ;put in X
  639.           LDA #0         ;top line
  640.           JSR SETCRSRX   ;set cursor
  641. ]LOOP     LDA OPTION,X   ;read option
  642.           BEQ DONEOP
  643.           JSR COUT       ;print it
  644.           INX
  645.           BNE ]LOOP
  646. DONEOP    JMP SETNORM    ;return from there
  647.  
  648. FLASHOP   PHA            ;preserve old index
  649.           LDA #$FF
  650.           JSR WAIT       ;wait a moment
  651.           JSR NORMLOP    ;return to normal
  652.           PLA
  653.           STA INDEX      ;restore index
  654.           RTS
  655.  
  656. PRTDASH   LDA #"-"       ;prints dashed line
  657.           LDX #79        ;80 characters
  658. ]LOOP     JSR COUT
  659.           DEX
  660.           BPL ]LOOP
  661.           RTS
  662.  
  663. INSTRUCT  LDA #>HELPMSG  ;get message address
  664.           LDX #<HELPMSG
  665. MSGOUT    STA MESSAGE+2  ;put address in place
  666.           STX MESSAGE+1
  667.           LDA #24        ;open message window
  668.           STA WNDBTM
  669.           LDA #20        ;center messages
  670.           STA WNDLFT
  671.           LDA #60
  672.           STA WNDWDTH
  673.           LDA #20
  674.           STA WNDTOP     ;close data display
  675.           JSR  HOME      ;clear mesage window
  676.           LDY #0
  677. MESSAGE   LDA MESSAGE,Y  ;address installed here
  678.           BEQ DNMSG
  679.           JSR COUT
  680.           INY
  681.           BNE MESSAGE    ;always
  682. DNMSG     LDA #20        ;close message window
  683.           STA WNDBTM
  684.           LDA #3         ;open data display
  685.           STA WNDTOP
  686.           LDA #80
  687.           STA WNDWDTH
  688.           LDA #0         ;left edge to zero
  689.           STA WNDLFT
  690.           RTS
  691.  
  692. READKEY   LDA KEY        ;read keyboard
  693.           BPL READKEY    ;wait for keypress
  694.           BIT STROBE     ;clear board
  695.           RTS
  696.  
  697. INPUT     LDX #0
  698. INSTART   STX COUNTER    ;save cursor location
  699.           LDX LEFT
  700.           STX CH
  701.           STX OURCH      ;set cursor to start
  702.           LDX #$FF       ;start with first char
  703.           LDY #$FF       ;start at length zero
  704. ]LOOP     INY
  705.           INX
  706.           CPX LENGTH     ;all done?
  707.           BEQ DONE       ;yes
  708.           LDA IN,X       ;get byte
  709.           BNE NORMAL     ;not terminator, okay
  710.           LDA #"_"       ;underline for the rest
  711. NORMAL    ORA #$80       ;(BASIC stores as inverse)
  712. PRINTIT   JSR COUT       ;print a char
  713.           STA IN,X       ;put in buffer
  714.           CMP #"_"       ;doing underline?
  715.           BNE ]LOOP      ;no, continue
  716.            INX           ;add one to count
  717.            CPX  LENGTH   ;done?
  718.           BNE PRINTIT    ;finish underline
  719. DONE      LDA #0
  720.           STA IN,X       ;terminator
  721.           STY DATALNTH   ;length of data
  722.  
  723. FLSHCRSR  LDX COUNTER    ;position within input
  724.           LDA IN,X       ;get char
  725.           BNE NOTEND     ;not beyond data
  726.           LDA #$A0       ;flash space cursor
  727. NOTEND    PHA            ;save normal char
  728.           EOR #$80       ;make inverse
  729.           JSR FLASH      ;print inverse cursor
  730.           PLA            ;retrieve char
  731.           JSR FLASH      ;print normal char
  732.           BPL FLSHCRSR   ;until a key pressed
  733.           LDY DATALNTH   ;restore Y
  734.           LDX COUNTER    ;restore X
  735.           BIT STROBE     ;clear board
  736.  
  737.           CMP #$8D       ;return key?
  738.           BEQ RETURN     ;yes
  739.           CMP #$95       ;right arrow?
  740.           BEQ FORWARD
  741.           CMP #$88       ;left arrow?
  742.           BEQ BACKUP
  743.           CMP #$84       ;control-D?
  744.           BEQ BACKUP
  745.           CMP #$FF       ;delete key?
  746.           BEQ BACKUP
  747.           CMP #$9B       ;escape key?
  748.           BEQ SETFLAG
  749.           CMP #$A0       ;is it a char?
  750.           BCS PROCESS    ;yes
  751. OOPS      JSR BELL       ;sorry
  752.           BEQ FLSHCRSR   ;try again
  753.  
  754. JMPSTART  BPL INSTART    ;bridge to INSTART
  755.  
  756. BACKUP    CPX #0         ;at left edge?
  757.           BEQ FLSHCRSR   ;yes, ignore command
  758.           DEX            ;move cursor left
  759.           CMP #$88       ;left arrow?
  760.           BEQ INSTART    ;back up only
  761.           STX COUNTER    ;preserve location
  762. ]LOOP     INX            ;get char to right
  763.           LDA IN,X       ;and move it
  764.           DEX            ;one to left
  765.           STA IN,X
  766.           INX            ;go to next spot
  767.           CPX LENGTH     ;done?
  768.           BNE ]LOOP      ;no
  769.           LDX COUNTER    ;restore location
  770.           BPL JMPSTART   ;print new data
  771.  
  772. FORWARD   CPX DATALNTH   ;cursor at end of data?
  773.           BCC ADVANCE    ;no
  774.           BEQ FLSHCRSR   ;yes, but no bell
  775.  
  776. PROCESS   CPX LENGTH     ;cursor at end of data?
  777.           BEQ OOPS       ;yes
  778.           CMP #"0"       ;is it a number?
  779.           BCC OOPS       ;no
  780.           CMP #$BA       ;range 0-9?
  781.           BCC RIGHT      ;yes, these okay
  782.           CMP #"G"       ;above F?
  783.           BCS OOPS       ;yes, wrong key
  784.           CMP #"A"       ;below A?
  785.           BCC OOPS       ;yes, wrong again
  786. RIGHT     STA IN,X       ;put it in at cursor
  787. ADVANCE   INX            ;move cursor to right
  788.           BPL JMPSTART   ;always
  789.  
  790. RETURN    CPY #0         ;any data?
  791.           BEQ SETFLAG    ;no
  792.           CLC            ;clear carry
  793.           RTS
  794. SETFLAG   SEC            ;set carry flag
  795.           RTS            ;done input routine
  796.  
  797. FLASH     PHA            ;save char
  798.           CLC
  799.           LDA COUNTER    ;add cursor location to
  800.           ADC LEFT       ;input location to get
  801.           STA CH         ;right spot on screen
  802.           STA OURCH
  803.           PLA            ;get char back
  804.           JSR COUT       ;print char
  805.           LDY #$60       ;pause
  806. YLOOP     LDX #$FF       ;flash rate
  807. XLOOP     LDA KEY        ;key pressed?
  808.           BMI DONEFLSH   ;yes
  809.           DEX            ;loop
  810.           BNE XLOOP
  811.           DEY
  812.           BNE YLOOP
  813. DONEFLSH  RTS
  814.  
  815. HEXASC    PHA            ;preserve char
  816.           AND #$0F       ;take low nibble
  817.           JSR CONVERT    ;convert to ascii
  818.           TAX            ;put in x register
  819.           PLA            ;retrieve char
  820.           LSR            ;shift high nibble
  821.           LSR            ;into low nibble
  822.           LSR
  823.           LSR
  824. CONVERT   ORA #$B0       ;convert to ascii
  825.           CMP #$BA       ;a number?
  826.           BCC DONEHEX    ;yes
  827.           ADC #6         ;add 6 + carry (A-F)
  828. DONEHEX   RTS            ;returns A=high nibble
  829.                          ;X=low nibble
  830.  
  831. DECIMAL   LDY #$B0       ;zero buffer (ascii)
  832.           STY DECMLBFR+1 ;enter with hex byte
  833.           STY DECMLBFR+2 ;in the accumulator
  834.           LDY #0
  835. ]LOOP     SEC            ;prepare to subtract
  836.           LDX #$FF       ;count from zero
  837. COUNT     INX
  838.           SBC #10        ;count # of 10's
  839.           BCS COUNT      ;keep track in X
  840.           ADC #10        ;subtracted 10 too many
  841.           ORA #$B0       ;convert to ascii
  842.           STA DECMLBFR,Y ;the decimal digit
  843.           INY            ;do the next digit
  844.           TXA            ;how many 10's
  845.           BNE ]LOOP      ;if x=0 then no more
  846.           RTS
  847.  
  848.  
  849. PRTLONIB  LDA #2
  850.           JSR SETCRSR    ;set cursor
  851.           LDY #0
  852. ]LOOP     LDA ADDRESS,Y  ;print "Addrs:"
  853.           BEQ PRTDIGIT
  854.           JSR COUT
  855.           INY
  856.           BNE ]LOOP
  857. PRTDIGIT  JSR SETINV     ;in inverse
  858.           TAY            ;start with 0
  859. ]LOOP     JSR PRBLNK     ;print 3 spaces between
  860.           TYA            ;from 0-15
  861.           JSR HEXASC     ;convert to ascii
  862.           TXA            ;print low nibble
  863.           JSR COUT       ;hex 0-F
  864.           INY
  865.           CPY #$10       ;done?
  866.           BNE ]LOOP      ;no
  867.           JMP SETNORM    ;return from there
  868.  
  869. TOGLMEM   JSR BELL       ;changing option
  870.           LDA INDEX      ;get current option
  871.           PHA            ;preserve it
  872.           LDA #4         ;option # for
  873.           STA INDEX      ;memory option
  874.           JSR MEMORY     ;toggle to main
  875.           PLA            ;get current option #
  876.           CMP INDEX      ;was it memory?
  877.           BEQ DONETOG1   ;yes, leave it inverse
  878.           JMP FLASHOP    ;no, back to normal
  879. DONETOG1  RTS
  880.  
  881. TOGLRAM   JSR BELL       ;changing RAM option
  882.           LDA INDEX      ;get current option #
  883.           PHA            ;preserve it
  884.           LDA #6         ;option # for RAM/ROM
  885.           STA INDEX
  886.           JSR RAMROM     ;toggle it to value
  887.           PLA            ;retrieve current index
  888.           CMP INDEX      ;is it RAM/ROM?
  889.           BEQ DONETOG2   ;yes, leave it inverse
  890.           JMP FLASHOP    ;no, return to normal
  891. DONETOG2  RTS
  892.  
  893. BELL      LDX #10        ;a little beep
  894. ]LOOP1    LDY #10        ;change values to
  895. ]LOOP2    TYA            ;suit yourseelf
  896.           JSR WAIT
  897.           BIT SPEAKER
  898.           DEY
  899.           BNE ]LOOP2
  900.           DEX
  901.           BNE ]LOOP1
  902.           RTS
  903.  
  904. STACKSUB  STA STOR80OFF  ;switch all $200-BFFF
  905.           STA RAMRDAUX   ;read aux memory
  906.           LDA (PAGE),Y   ;read a byte
  907.           STA RAMRDMAIN  ;read main memory
  908.           STA STOR80ON   ;protect aux text pages
  909.           RTS
  910. *
  911. * Screen Dump Routine
  912. *
  913. DBLDUMP   LDA CV
  914.           PHA            ;save cursor
  915.           LDA CSWL+1     ;save CSW on stack
  916.           PHA
  917.           LDA CSWL
  918.           PHA
  919.           LDX #$C1       ;for slot 1
  920.           STX CSWL+1     ;put in CSW
  921.           LDX #0         ;low byte
  922.           STX CSWL
  923.           STX COUNTER    ;zero line counter
  924. INITPTR   INX
  925.           LDA PTRINIT-1,X ;init parallel printer
  926.           BEQ SCRNLOOP   ;when done
  927.           JSR COUT
  928.           BNE INITPTR    ;get next char
  929. SCRNLOOP  JSR TABV       ;get screen address
  930.           LDY #00        ;counter to zero
  931. LINELOOP  BIT PAGE2AUX   ;turn on aux memory
  932.           LDA (BASL),Y   ;byte from aux page
  933.           PHP            ;save status
  934.           BIT PAGE2MAIN  ;turn on main memory
  935.           PLP            ;restore status
  936.           JSR DOBYTE     ;process the byte
  937.           LDA (BASL),Y   ;byte from main mem
  938.           JSR DOBYTE     ;process the byte
  939.           INY            ;increment counter
  940.           CPY #40        ;done 80 characters?
  941.           BCC LINELOOP   ;no, do the next
  942.           JSR CROUT      ;send carriage return
  943.           INC COUNTER    ;increment line counter
  944.           LDA COUNTER    ;check if done
  945.           CMP #24        ;done 24 lines?
  946.           BCC SCRNLOOP   ;loop till done
  947.           PLA
  948.           STA CSWL       ;restore CSW
  949.           PLA
  950.           STA CSWL+1
  951.           PLA            ;get cursor location
  952.           TAX
  953.           DEX
  954.           BEQ TOP        ;at top of screen
  955.           DEX
  956. TOP       STX CV         ;restore cursor
  957.           RTS
  958.  
  959. * Transform byte for printer
  960.  
  961. DOBYTE    BMI HIBIT      ;high bit ascii
  962.           LDX IDBYTE     ;check identity
  963.           CPX #$EA       ;unenhanced IIe?
  964.           BEQ SETHIBIT   ;yes, set high bit
  965.           CMP #$40       ;@ thru ? inverse
  966.           BCC MAINCHAR   ;same as main chars
  967.           CMP #$60       ;lower case inverse
  968.           BCC NULL       ;mousetext
  969. SETHIBIT  ORA #$80       ;set high bit
  970. HIBIT     CMP #$FF       ;delete char?
  971.           BEQ NULL       ;don't send that
  972.           CMP #$A0       ;control char?
  973.           BCS SENDIT     ;no, then it's okay
  974. NULL      LDA #$A0       ;space
  975.           BMI SENDIT     ;always taken
  976. MAINCHAR  ORA #$C0       ;ascii in range $C0-$FF
  977.           CMP #$E0
  978.           BCC SENDIT     ;$C0-DF, @ to underline
  979.           EOR #$40       ;$A0-BF, space to ?
  980. SENDIT    JSR COUT
  981.           RTS
  982.  
  983. * Parallel printer initialization code
  984.  
  985. PTRINIT   HEX 89         ;ctrl-I
  986.           ASC "80N"
  987.           HEX 8D00
  988. *
  989. * Option line
  990. *
  991. OPTION    ASC "Next Page"8D00
  992.           ASC "Prev.Page"8D00
  993.           ASC "New Page"8D00
  994. FORMATOP  ASC "Hex"8D00
  995. MEMORYOP  ASC "Main Memory"8D00
  996. BANKOP    ASC "Bank $  "8D00 ;2 spaces
  997. RAMOP     ASC "RAM1"8D00
  998.           ASC "Disasm"8D00
  999.           ASC "Print"8D00
  1000.  
  1001. * Replacement text
  1002.  
  1003. FORMTEXT  ASC "Hex"00
  1004.           ASC "Dec"00
  1005.           ASC "Asc"00
  1006. MEMTEXT   ASC "Main"00
  1007.           ASC "Aux."00
  1008. RAMTEXT   ASC "ROM "00   ;1 space
  1009.           ASC "RAM1"00
  1010.           ASC "RAM2"00
  1011.           ASC "SLOT"00
  1012.  
  1013. TITLE     INV "----------------------"8D3E ;22 hyphens
  1014.           ASC "                    "3C8D3E ;20 spaces
  1015.           ASC "    MEMORY.PROBE    "3C8D3E
  1016.           ASC "   By Jim Benedict  "3C8D3E
  1017.           ASC " Copyright 1991 by  "3C8D3E
  1018.           ASC "MindCraft Publ.Corp."3C8D3E
  1019.           ASC " Lincoln, MA  01773 "3C8D3E
  1020.           ASC "                    "3C8D ;20 spaces
  1021.           INV "----------------------"8D8D ;22 hyphens
  1022.           ASC "Press a key..."8D00
  1023.  
  1024. NEWMSG    ASC "Enter a two-digit hex number "
  1025.           ASC "(e.g. $FD)"8D
  1026.           ASC "<ESC> cancels.  ENTER PAGE: $"00
  1027.  
  1028. HELPMSG   ASC "Arrows <-- --> change "
  1029.           ASC "highlighted option."8D
  1030.           ASC "Space bar toggles format "
  1031.           ASC "and memory options."8D
  1032.           ASC "Press <RETURN> to display data, "
  1033.           ASC "<ESC> to quit."8D00
  1034.  
  1035. ADDRESS   ASC "  Address:"00  ;2 spaces
  1036.  
  1037. PRNTMSG   ASC "<RETURN> dumps screen to printer."8D
  1038.           ASC "<ESC> cancels.  Enter selection:"00
  1039.  
  1040. DISMSG    ASC "<RETURN> to accept address: $"8D
  1041.           ASC "<ESC> cancels disassembly."8D00
  1042.  
  1043. QUITMSG   ASC "Press <ESC> to quit the program."8D
  1044.           ASC "Any other key returns to program."8D00
  1045.  
  1046. APPLEII   ASC "MEMORY.PROBE REQUIRES A //E OR //C."8D8D
  1047.           ASC "PRESS ANY KEY TO CONTINUE."8D00
  1048. *
  1049. * Tables
  1050. *
  1051. CMDTABLE  DA NEXTPAGE
  1052.           DA PREVPAGE
  1053.           DA NEWPAGE
  1054.           DA DOPAGE      ;display data
  1055.           DA DOPAGE
  1056.           DA DOPAGE
  1057.           DA DOPAGE
  1058.           DA DISASMBL
  1059.           DA PRINTER
  1060. TOGLTABL  DA RTS         ;no toggle this option
  1061.           DA RTS         ;dummy subroutine
  1062.           DA NEWPAGE
  1063.           DA FORMAT
  1064.           DA MEMORY
  1065.           DA BANK
  1066.           DA RAMROM
  1067.           DA RTS
  1068.           DA RTS
  1069. DECMLBFR  HEX 000000     ;3 bytes
  1070. BYTETABL  HEX 82888082   ;LOB softswitch address
  1071. CRSRTABL  HEX 000B162025323C424A
  1072. BANKTABL  HEX 0000000000000000 ;READMEM puts
  1073.           HEX 0000000000000000 ;bank #'s here
  1074. *
  1075. * Find memory banks of aux. slot cards
  1076. *
  1077. READMEM   STA SETALTZP   ;turn on alternate zp
  1078.           LDX #0         ;bank counter
  1079.           LDY #0         ;start at bank 0
  1080. ]LOOP     STY BANKREG    ;turn on bank
  1081.           STY COUNTER    ;write a byte
  1082.           CPY COUNTER    ;read it
  1083.           BNE NOBANK     ;not same, no bank
  1084.           TYA            ;put bank # in A
  1085.           STA BANKTABL,X ;save it in table
  1086.           INX
  1087. NOBANK    INY            ;check next bank
  1088.           CPY #$10       ;done 16?
  1089.           BNE ]LOOP      ;no
  1090.           LDY #0
  1091.           STY BANKREG    ;set bank to zero
  1092.           STA SETSTDZP   ;turn on main zp
  1093.           RTS
  1094.